﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using Sinacor.Infra.UI.Controls.SmartClient;
using Sinacor.UI.Bovespa.ResumoFinanceiro.Presenter;
using Sinacor.Infra.UI.Common;
using Sinacor.UI.Bovespa.Clientes.View.SmartClient;

namespace Sinacor.UI.Bovespa.ResumoFinanceiro.View.SmartClient
{
    public partial class FinanceiroPendente : SinacorWindow, IFinanceiroPendente
    {
        #region Propriedades

        public Presenter.FinanceiroPendente PresenterFinanceiroPendente { get; set; }

        #endregion

        #region Construtor

        public FinanceiroPendente(Model.Enum.TipoSistema tipoSistema)
        {
            this.InitializeComponent();

            this.IniciarObjetos(tipoSistema);
        }

        #endregion

        #region Metodos

        private void IniciarObjetos(Model.Enum.TipoSistema tipoSistema)
        {
            this.PresenterFinanceiroPendente = new Presenter.FinanceiroPendente(this);
            this.DataContext = this.PresenterFinanceiroPendente;

            DtgFinanceiroPendentes.NewItemType = typeof(Model.FinanceiroPendente);

            this.PresenterFinanceiroPendente.FiltroCalculoFinanceiro.TipoSistema = tipoSistema;

            this.AfterInitialize += new RoutedEventHandler(FinanceiroPendente_AfterInitialize);
            this.Closing += new System.ComponentModel.CancelEventHandler(FinanceiroPendente_Closing);

            BtnConsultaClientes.OnBufferedClick += new SinacorButton.OnBufferClickHandler(BtnConsultaClientes_OnBufferedClick);
            BtnConsultaBroker.OnBufferedClick += new SinacorButton.OnBufferClickHandler(BtnConsultaBroker_OnBufferedClick);
            BtnCalcular.OnBufferedClick += new SinacorButton.OnBufferClickHandler(BtnCalcular_OnBufferedClick);
            BtnCalculaTudo.OnBufferedClick += new SinacorButton.OnBufferClickHandler(BtnCalculaTudo_OnBufferedClick);
            BtnCancelar.OnBufferedClick += new SinacorButton.OnBufferClickHandler(BtnCancelar_OnBufferedClick);
            BtnNovaPesquisa.OnBufferedClick += new SinacorButton.OnBufferClickHandler(BtnNovaPesquisa_OnBufferedClick);
            BtnPesquisar.OnBufferedClick += new SinacorButton.OnBufferClickHandler(BtnPesquisar_OnBufferedClick);
        }

        private void LimparCampos()
        {
            if (this.PresenterFinanceiroPendente.ListaFinanceiroPendente != null &&
                this.PresenterFinanceiroPendente.ListaFinanceiroPendente.Count > 0)
            {
                this.PresenterFinanceiroPendente.ListaFinanceiroPendente.Clear();
                this.AtualizarListaFinanceirosPendentes();
            }

            this.PresenterFinanceiroPendente.FiltroFinanceiroPendente.Cliente = new Model.Cliente();
            this.PresenterFinanceiroPendente.FiltroFinanceiroPendente.Broker = new Model.Cliente();

            this.PresenterFinanceiroPendente.FiltroFinanceiroPendente.DataPregao = this.PresenterFinanceiroPendente.InformacoesMovimento.DataMovimento;
            this.PresenterFinanceiroPendente.FiltroFinanceiroPendente.IndicadorBroker = Sinacor.UI.Bovespa.ResumoFinanceiro.Model.Enum.TipoCliente.Cliente;

            this.PresenterFinanceiroPendente.StatusProcesso.Step = string.Empty;
            this.PresenterFinanceiroPendente.StatusProcesso.Progress = 0;

            TxtBroker.UpdateTarget(SinacorTextBox.TextProperty);
            TxtCliente.UpdateTarget(SinacorTextBox.TextProperty);

            this.AtualizarStatus();
            this.AtualizarDataPregao();
            this.AtualizarTipoCliente();
        }

        private void CalcularFinanceiro()
        {
            if (DtgFinanceiroPendentes.SelectedItems != null)
            {
                this.PresenterFinanceiroPendente.FiltroCalculoFinanceiro.FinanceirosPendentes =
                    new ModelCollection<Model.FinanceiroPendente>();

                foreach (Model.FinanceiroPendente item in DtgFinanceiroPendentes.SelectedItems)
                {
                    this.PresenterFinanceiroPendente.FiltroCalculoFinanceiro.FinanceirosPendentes.Add(item);
                }
            }

            this.PresenterFinanceiroPendente.CalcularFinanceiros(false);
        }

        private Model.Cliente PesquisarClientes(String apelido)
        {
            Model.Cliente retorno = null;
            PesquisaClientes pesquisaClientes = new PesquisaClientes();

            Clientes.Model.PesquisaCliente filtroPesq = new Sinacor.UI.Bovespa.Clientes.Model.PesquisaCliente();
            filtroPesq.Apelido = apelido;

            pesquisaClientes.CarregaParametros(Sinacor.UI.Bovespa.Clientes.Model.Enum.JanelaChamada.ManutencaoOrdens, filtroPesq);

            pesquisaClientes.Owner = this;
            pesquisaClientes.SetMenuHeader("Bovespa.Ordens.Label.ManutencaoOrdens");
            pesquisaClientes.ShowDialog();

            if (pesquisaClientes.PesquisaClienteModel.Codigo.HasValue && pesquisaClientes.PesquisaClienteModel.Codigo > 0)
            {
                retorno = new Model.Cliente
                {
                    Codigo = pesquisaClientes.PesquisaClienteModel.Codigo,
                    Apelido = pesquisaClientes.PesquisaClienteModel.Apelido
                };
            }

            pesquisaClientes = null;

            return retorno;
        }

        #endregion

        #region Eventos

        private void FinanceiroPendente_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            if (this.PresenterFinanceiroPendente.VerificarProcessamento())
            {
                SinacorMessageBoxResult result = SinacorMessageBox.Show(this.TryFindResource("Bovespa.ResumoFinanceiro.Message.ConfirmacaoFechamentoTela").ToString(),
                                       SinacorMessageBoxButton.YesNo,
                                       SinacorMessageBoxImage.Question);

                if (result == SinacorMessageBoxResult.No)
                    e.Cancel = true;

            }
        }

        private void FinanceiroPendente_AfterInitialize(object sender, RoutedEventArgs e)
        {
            this.FinalizarExportacao();
            this.PresenterFinanceiroPendente.Inicializar();
        }

        private void BtnPesquisar_OnBufferedClick(object sender, RoutedEventArgs e, int clickCount)
        {
            this.ClearServiceErrors();
            
            this.ShowUserWaitingProcess();

            this.PresenterFinanceiroPendente.ConsultarFinanceirosPendentes();

            this.HideUserWaitingProcess();
        }

        private void BtnNovaPesquisa_OnBufferedClick(object sender, RoutedEventArgs e, int clickCount)
        {
            this.ClearServiceErrors();
            
            this.LimparCampos();
        }

        private void BtnCancelar_OnBufferedClick(object sender, RoutedEventArgs e, int clickCount)
        {
            this.PresenterFinanceiroPendente.CancelarProcessamento();
        }

        private void BtnCalculaTudo_OnBufferedClick(object sender, RoutedEventArgs e, int clickCount)
        {
            this.ClearServiceErrors();
            
            this.PresenterFinanceiroPendente.FiltroCalculoFinanceiro.FinanceirosPendentes = null;

            this.PresenterFinanceiroPendente.CalcularFinanceiros(true);
        }

        private void BtnCalcular_OnBufferedClick(object sender, RoutedEventArgs e, int clickCount)
        {
            this.ClearServiceErrors();

            this.CalcularFinanceiro();
        }

        private void BtnConsultaBroker_OnBufferedClick(object sender, RoutedEventArgs e, int clickCount)
        {
            Model.Cliente cliente = null;

            cliente = this.PesquisarClientes(this.PresenterFinanceiroPendente.FiltroFinanceiroPendente.Broker.Apelido);

            if (cliente != null)
                this.PresenterFinanceiroPendente.FiltroFinanceiroPendente.Broker = cliente;

            TxtBroker.UpdateTarget(SinacorTextBox.TextProperty);
        }

        private void BtnConsultaClientes_OnBufferedClick(object sender, RoutedEventArgs e, int clickCount)
        {
            Model.Cliente cliente = null;

            cliente = this.PesquisarClientes(this.PresenterFinanceiroPendente.FiltroFinanceiroPendente.Cliente.Apelido);

            if (cliente != null)
                this.PresenterFinanceiroPendente.FiltroFinanceiroPendente.Cliente = cliente;

            TxtBroker.UpdateTarget(SinacorTextBox.TextProperty);
        }

        private void TxtCliente_Validating(object sender, Sinacor.Infra.UI.Controls.SmartClient.Validation.ValidatingEventArgs e)
        {
            e.Result = new ValidationResult(true, "");

            if (this.PresenterFinanceiroPendente.FiltroFinanceiroPendente != null &&
                this.PresenterFinanceiroPendente.FiltroFinanceiroPendente.Cliente != null &&
                e.Value != null && !string.IsNullOrEmpty(e.Value.ToString()))
            {
                this.PresenterFinanceiroPendente.VerificarCliente(e.Value.ToString());

                if (this.PresenterFinanceiroPendente.ClienteAtual == null)
                {
                    this.PresenterFinanceiroPendente.FiltroFinanceiroPendente.Cliente.Codigo = null;
                    e.Result = new ValidationResult(false, "Bovespa.ResumoFinanceiro.Message.ClienteNaoCadastrado");
                }
                else
                {
                    this.PresenterFinanceiroPendente.FiltroFinanceiroPendente.Cliente.Codigo = 
                        this.PresenterFinanceiroPendente.ClienteAtual.Codigo;

                    if (this.PresenterFinanceiroPendente.FiltroFinanceiroPendente.Broker != null &&
                        this.PresenterFinanceiroPendente.FiltroFinanceiroPendente.Broker.Codigo.HasValue &&
                        this.PresenterFinanceiroPendente.FiltroFinanceiroPendente.Broker.Codigo != this.PresenterFinanceiroPendente.ClienteAtual.Broker)
                    {
                        e.Result = new ValidationResult(false, "Bovespa.ResumoFinanceiro.Message.ClienteNaoFilhote");
                    }
                   
                }
            }
            else
                this.PresenterFinanceiroPendente.FiltroFinanceiroPendente.Cliente.Codigo = null;
        }

        private void TxtBroker_Validating(object sender, Sinacor.Infra.UI.Controls.SmartClient.Validation.ValidatingEventArgs e)
        {
            e.Result = new ValidationResult(true, "");

            if (this.PresenterFinanceiroPendente.FiltroFinanceiroPendente != null &&
                this.PresenterFinanceiroPendente.FiltroFinanceiroPendente.Broker != null &&
                e.Value != null && !string.IsNullOrEmpty(e.Value.ToString()))
            {
                this.PresenterFinanceiroPendente.VerificarCliente(e.Value.ToString());

                if (this.PresenterFinanceiroPendente.ClienteAtual == null)
                {
                    this.PresenterFinanceiroPendente.FiltroFinanceiroPendente.Broker.Codigo = null;
                    e.Result = new ValidationResult(false, "Bovespa.ResumoFinanceiro.Message.BrokerNaoCadastrado");
                }
                else
                {
                    this.PresenterFinanceiroPendente.FiltroFinanceiroPendente.Broker.Codigo =
                        this.PresenterFinanceiroPendente.ClienteAtual.Codigo;
                }
            }
            else
                this.PresenterFinanceiroPendente.FiltroFinanceiroPendente.Broker.Codigo = null;
        }

        private void CmiCacularFinanceiro_Click(object sender, RoutedEventArgs e)
        {
            this.CalcularFinanceiro();
        }

        private void CmiCacularFinanceiro_Loaded(object sender, RoutedEventArgs e)
        {
            if (sender is SinacorContextMenuItem)
            {
                (sender as SinacorContextMenuItem).IsEnabled = BtnCalcular.IsEnabled;
            }
        }

        #endregion

        #region IFinanceiroPendente Members

        public void InformarSucessoCalculoFinanceiro()
        {
            this.Dispatcher.Invoke((Action)delegate()
            {
                this.FinalizarExportacao();

                SinacorMessageBox.Show(this.TryFindResource("Bovespa.ResumoFinanceiro.Message.CalculoFinanceiroConcluido").ToString(),
                                       SinacorMessageBoxButton.Ok,
                                       SinacorMessageBoxImage.Information);
            },
            System.Windows.Threading.DispatcherPriority.ApplicationIdle);
        }

        public bool ConfirmarCalculoFinanceiro()
        {
            SinacorMessageBoxResult result = SinacorMessageBox.Show(this.TryFindResource("Bovespa.ResumoFinanceiro.Message.ConfirmaProcCalculoFinanceiro").ToString(),
                                       SinacorMessageBoxButton.YesNo,
                                       SinacorMessageBoxImage.Question);

            return (result == SinacorMessageBoxResult.Yes);
        }

        public bool ConfirmarCalculoFinanceiroTudo()
        {
            SinacorMessageBoxResult result = SinacorMessageBox.Show(this.TryFindResource("Bovespa.ResumoFinanceiro.Message.ConfirmaCalculaTudo").ToString(),
                                       SinacorMessageBoxButton.YesNo,
                                       SinacorMessageBoxImage.Question);

            return (result == SinacorMessageBoxResult.Yes);
        }

        public bool ConfirmaCalculaTudoNaoSelecionado()
        {
            SinacorMessageBoxResult result = SinacorMessageBox.Show(this.TryFindResource("Bovespa.ResumoFinanceiro.Message.ConfirmaCalculaTudoNaoSelecionado").ToString(),
                                       SinacorMessageBoxButton.YesNo,
                                       SinacorMessageBoxImage.Question);

            return (result == SinacorMessageBoxResult.Yes);
        }

        public void InformarCalculoFinanceiroCancelado()
        {
            this.Dispatcher.Invoke((Action)delegate()
            {
                this.FinalizarExportacao();

                SinacorMessageBox.Show(this.TryFindResource("Bovespa.ResumoFinanceiro.Message.CalculoFinanceiroCancelado").ToString(),
                                       SinacorMessageBoxButton.Ok,
                                       SinacorMessageBoxImage.Exclamation);
            },
            System.Windows.Threading.DispatcherPriority.ApplicationIdle);
        }


        public void AtualizarListaFinanceirosPendentes()
        {
            DtgFinanceiroPendentes.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }

        public void HabilitarCancelamentoProcesso()
        {
            this.Dispatcher.Invoke((Action)delegate()
            {
                BtnPesquisar.IsEnabled = false;
                BtnNovaPesquisa.IsEnabled = false;
                BtnCancelar.IsEnabled = true;
                BtnCalcular.IsEnabled = false;
                BtnCalculaTudo.IsEnabled = false;
            },
            System.Windows.Threading.DispatcherPriority.ApplicationIdle);
        }

        public void AtualizarStatus()
        {
            this.Dispatcher.Invoke((Action)delegate()
            {
                if (String.IsNullOrEmpty(PresenterFinanceiroPendente.StatusProcesso.Step))
                {
                    PgbProgresso.ProgressBarText = " ";
                }
                else
                {
                    PgbProgresso.ProgressBarText = FindResource(PresenterFinanceiroPendente.StatusProcesso.Step).ToString();
                }

                PgbProgresso.UpdateTarget(SinacorProgressBar.ValueProperty);
            });
        }

        public void DesabilitarCancelamentoProcesso()
        {
            this.Dispatcher.Invoke((Action)delegate()
            {
                BtnPesquisar.IsEnabled = false;
                BtnNovaPesquisa.IsEnabled = false;
                BtnCancelar.IsEnabled = true;
                BtnCalcular.IsEnabled = false;
                BtnCalculaTudo.IsEnabled = false;
            },
            System.Windows.Threading.DispatcherPriority.ApplicationIdle);
        }

        public void FinalizarExportacao()
        {
            this.Dispatcher.Invoke((Action)delegate()
            {
                this.DtgFinanceiroPendentes.UnselectAll();

                BtnPesquisar.IsEnabled = true;
                BtnNovaPesquisa.IsEnabled = true;
                BtnCancelar.IsEnabled = false;
                BtnCalcular.IsEnabled = true;
                BtnCalculaTudo.IsEnabled = true;
            },
            System.Windows.Threading.DispatcherPriority.ApplicationIdle);
        }


        public void PrepararControlesInicioProcesso()
        {
            BtnPesquisar.IsEnabled = false;
            BtnNovaPesquisa.IsEnabled = false;
            BtnCancelar.IsEnabled = false;
            BtnCalcular.IsEnabled = false;
            BtnCalculaTudo.IsEnabled = false;
        }

        public void AtualizarListaCalendario()
        {
            CboDataPregao.UpdateTarget(SinacorComboBox.ItemsSourceProperty);
        }

        public void AtualizarDataPregao()
        {
            CboDataPregao.UpdateTarget(SinacorComboBox.SelectedValuePathProperty);
        }

        public void AtualizarListaTipoCliente()
        {
            CboIndBroker.UpdateTarget(SinacorComboBox.ItemsSourceProperty);
        }

        public void AtualizarTipoCliente()
        {
            CboIndBroker.UpdateTarget(SinacorComboBox.SelectedValuePathProperty);
        }

        public void InformarProcessoConcluidoComErros()
        {
            this.Dispatcher.Invoke((Action)delegate()
            {
                this.FinalizarExportacao();

                SinacorMessageBox.Show(this.TryFindResource("Bovespa.ResumoFinanceiro.Message.ProcessoConcluidoComErros").ToString(),
                                       SinacorMessageBoxButton.Ok,
                                       SinacorMessageBoxImage.Exclamation);
            },
            System.Windows.Threading.DispatcherPriority.ApplicationIdle);
        }

        public bool ConfirmarCancelamento()
        {
            SinacorMessageBoxResult result = SinacorMessageBox.Show(this.TryFindResource("Bovespa.ResumoFinanceiro.Message.ConfirmaCancelamento").ToString(),
                                       SinacorMessageBoxButton.YesNo,
                                       SinacorMessageBoxImage.Question);

            return (result == SinacorMessageBoxResult.Yes);
        }

        public void RemoverRegistro(Model.FinanceiroPendente financeiroPendente)
        {
            this.Dispatcher.Invoke((Action)delegate()
            {
                this.PresenterFinanceiroPendente.ListaFinanceiroPendente.Remove(financeiroPendente);
            },
            System.Windows.Threading.DispatcherPriority.ApplicationIdle);
        }

        public void InserirRegistro(Model.FinanceiroPendente financeiroPendente)
        {
            this.Dispatcher.Invoke((Action)delegate()
            {
                this.PresenterFinanceiroPendente.ListaFinanceiroPendente.Add(financeiroPendente);
            },
            System.Windows.Threading.DispatcherPriority.ApplicationIdle);
        }

        #endregion
    }
}
